package com.leyou.pay.service;

import com.github.wxpay.sdk.WXPay;
import com.leyou.pay.config.WxPayConfig;
import com.leyou.pay.entity.PayState;
import com.leyou.pay.entity.WxPayParam;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;

import java.util.HashMap;
import java.util.Map;

@Service
@Slf4j
public class WxPayService {

    private WXPay wxPay;

    public WxPayService(WxPayConfig payConfig){
        // 真实开发时
        wxPay = new WXPay(payConfig);
        // 测试时
        // wxPay = new WXPay(payConfig, WXPayConstants.SignType.MD5, true);
    }

    /**
     * 获取支付链接
     * @param payParam
     * @return
     */
    public String getUrl(WxPayParam payParam) {
        try {
            Map<String, String> data = new HashMap<>();
            // 商品详情
            data.put("detail", payParam.getDetail());
            // 商品描述
            data.put("body", payParam.getBody());
            // 订单号
            data.put("out_trade_no", payParam.getOutTradeNo());
            //货币
            data.put("fee_type", payParam.getFeeType());
            //金额，单位是分
            data.put("total_fee", payParam.getTotalFee());
            //调用微信支付的终端IP（乐优商城的IP）
            data.put("spbill_create_ip", payParam.getSpbillCreateIp());
            //回调地址，付款成功后的接口
            data.put("notify_url", payParam.getNotifyUrl());
            // 交易类型为扫码支付
            data.put("trade_type", payParam.getTradeType());
            //商品id, 使用假数据
            data.put("product_id", payParam.getProductId());

            Map<String, String> result = this.wxPay.unifiedOrder(data);

            if ("SUCCESS".equals(result.get("return_code"))) {
                return result.get("code_url");
            } else {
                log.error("创建预交易订单失败，错误信息：{}", result.get("return_msg"));
                return null;
            }
        } catch (Exception e) {
            e.printStackTrace();
            log.error("创建预交易订单异常", e);
            return null;
        }
    }

    /**
     * 查询微信扫码支付状态
     * @param orderId 订单号
     * @return
     */
    public PayState queryPayStatus(Long orderId) {
        Map<String, String> data = new HashMap<>();
        // 订单号
        data.put("out_trade_no", orderId.toString());
        try {
            Map<String, String> result = this.wxPay.orderQuery(data);
            if (result == null) {
                // 未查询到结果，认为是未付款
                return PayState.NOT_PAY;
            }
            String state = result.get("trade_state");
            if ("SUCCESS".equals(state)) {
                // success，则认为付款成功
                return PayState.SUCCESS;
            } else if (StringUtils.equals("USERPAYING", state) || StringUtils.equals("NOTPAY", state)) {
                // 未付款或正在付款，都认为是未付款
                return PayState.NOT_PAY;
            } else {
                // 其它状态认为是付款失败
                return PayState.FAIL;
            }
        } catch (Exception e) {
            log.error("查询订单状态异常", e);
            return PayState.NOT_PAY;
        }
    }
}
